#pragma once


#include "common\define.h"
#include "common\clipper.h"
#include "common\common.hpp"

#include "opencv2/opencv.hpp"
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include "infer_seg_v2_o.h"
#include "openvino/openvino.hpp"

#include <vector>
#include <cmath>
#include <cstring>
#include <memory>

#include "../txr_algo_dlm_seg/txr_algo_dlm_seg_define.h"

using namespace txr_algo_dlm_seg;


// 从位图中提取框
void BoxesFromBitmap(
    const cv::Mat pred, 
    const cv::Mat bitmap,
    const int& final_resize_h, 
    const int& final_resize_w,
    st_encrypt_info_ovino& info, 
    st_detect_unit& unit
);

// 获取最小外接矩形
std::vector<std::vector<float>> GetMiniBoxes(cv::RotatedRect box, float& ssid);

// Mat转换为Vector
std::vector<std::vector<float>> Mat2Vector(cv::Mat mat);

// 排序函数
bool XsortFp32(std::vector<float> a, std::vector<float> b);
bool XsortInt(std::vector<int> a, std::vector<int> b);

// 获取轮廓面积
void GetContourArea(
    const std::vector<std::vector<float>>& box,
    float unclip_ratio, 
    float& distance
);

// 框扩张
cv::RotatedRect UnClip(
    std::vector<std::vector<float>> box,
    const float& unclip_ratio
);

// 多边形评分
float PolygonScoreAcc(std::vector<cv::Point> contour, cv::Mat pred);

// 快速框评分
float BoxScoreFast(std::vector<std::vector<float>> box_array, cv::Mat pred);

// 过滤检测结果
std::vector<std::vector<std::vector<int>>> FilterTagDetRes(
    std::vector<std::vector<std::vector<int>>> boxes, 
    std::vector<float>& v_box_prob,
    float ratio_h,
    float ratio_w, 
    st_img_rgb& srcimg
);

// 顺时针排序点
std::vector<std::vector<int>> OrderPointsClockwise(std::vector<std::vector<int>> pts);

// 获取旋转裁剪图像
cv::Mat GetRotateCropImage(
    const cv::Mat& srcimage,
    std::vector<std::vector<int>> box
);

// 浮点数值限制
inline float clampf(float x, float min, float max) {
    if (x > max) return max;
    if (x < min) return min;
    return x;
}

// 模板类型值限制
template <class T> 
inline T clamp(T x, T min, T max) {
    if (x > max) return max;
    if (x < min) return min;

    return x;
}